package main

func makeArr(m, n int) [][]int {
	arr := make([][]int, m)
	for i := range arr {
		arr[i] = make([]int, n)
	}
	return arr
}

func isValidSudoku(board [][]byte) bool {
	rowMap := makeArr(9, 9)
	columnMap := makeArr(9, 9)
	boxMap := makeArr(9, 9)
	for i := range board {
		row := board[i]
		for j := range row {
			if row[j] == '.' {
				continue
			}
			val := row[j] - '1'
			if rowMap[i][val] > 0 {
				return false
			}
			rowMap[i][val] = 1
			if columnMap[j][val] > 0 {
				return false
			}
			columnMap[j][val] = 1
			boxIdx := (i/3)*3 + j/3
			if boxMap[boxIdx][val] > 0 {
				return false
			}
			boxMap[boxIdx][val] = 1
		}
	}
	return true
}

func main() {
	b := [][]byte{
		{'5', '3', '.', '.', '7', '.', '.', '.', '.'},
		{'6', '.', '.', '1', '9', '5', '.', '.', '.'},
		{'.', '9', '8', '.', '.', '.', '.', '6', '.'},
		{'8', '.', '.', '.', '6', '.', '.', '.', '3'},
		{'4', '.', '.', '8', '.', '3', '.', '.', '1'},
		{'7', '.', '.', '.', '2', '.', '.', '.', '6'},
		{'.', '6', '.', '.', '.', '.', '2', '8', '.'},
		{'.', '.', '.', '4', '1', '9', '.', '.', '5'},
		{'.', '.', '.', '.', '8', '.', '.', '7', '9'},
	}
	println(isValidSudoku(b))
}
